Porównać w języku Julia reprezentację bitową liczby 1/3 dla Float16, Float32, Float64 oraz liczby,
która jest inicjalizowana jako Float16, a potem rzutowana na Float64.
#using Pkg
#Pkg.add("DataFrames")
using DataFrames
fl = [Float16(1/3), Float32(1/3), Float64(1/3), Float64(Float16(1/3))]
fl_bit = map(x -> bitstring(x), fl)
floats = DataFrame()
floats.Float_type=["Float16", "Float32", "Float64", "Float16->Float64"]
floats.Sign_bit = map(x -> x[1], fl_bit)
floats.Exponent_bits = [fl_bit[1][2:6], fl_bit[2][2:9], fl_bit[3][2:12], fl_bit[4][2:12]]
floats.Mantissa_bits = [fl_bit[1][7:16], fl_bit[2][10:32], fl_bit[3][13:64], fl_bit[4][13:64]]
floats
| Row | Float_type | Sign_bit | Exponent_bits | Mantissa_bits |
|---|---|---|---|---|
| String | Char | String | String | |
| 1 | Float16 | 0 | 01111 | 1111010101 |
| 2 | Float32 | 0 | 01111111 | 10101010101010101010101 |
| 3 | Float64 | 0 | 01111111101 | 0101010101010101010101010101010101010101010101010101 |
| 4 | Float16->Float64 | 0 | 01111111101 | 0101010101000000000000000000000000000000000000000000 |
Okazuje się, że po rzutowaniu Float16 na Float64 pozostała część mantysy wypełniana jest zerami. Naturalnie taka liczba mniej dokładnie oddaje wartość 1/3 niż liczba pierwotnie zainicjalizowana jako Float64.
Zbadać, jak zmienia się odległość między kolejnymi liczbami zminnoprzecinkowymi reprezentowanymi w komputerze za pomocą języka Julia. Narysować wykres używając Plots zależności odległości od wartości liczby dla zakresu od 1.0 do 1000000.0.
#using Pkg
#Pkg.add("Plots")
using Plots
r = 1:1000000
epsilons = [eps(Float64(n)) for n in r]
plot(r, epsilons, title="", label="", xlabel="value of the number", ylabel="distance between neighbouring numbers")